草庐IT

Java final 与 C++ const

全部标签

c++ - 从 Derived** 到 Base*const* 的转换

请在链接parashift之前阅读我的问题,我可以谷歌搜索,这种情况略有不同。这是不允许的Child**cc;Base**bb=cc;因为你可以做到*bb=newOtherChild;但是如果我们有Child**cc;constBase*const*constbb=cc;我不认为所有这些常量对于我的示例都是必需的,但只是为了确定..我认为应该工作的最低限度是Base*const*bb=cc;那你不能这样做*bb=newOtherChild;所以应该是安全的。但为什么不允许呢? 最佳答案 你混淆了两种情况:添加const上行虽然形式上

c++ - 构造函数中的 const int ref 可以安全地绑定(bind)到文字吗?

我知道该标准有一个关于延长临时对象生命周期的异常(exception),基本上说在构造函数中绑定(bind)一个const引用不会延长生命周期,但这是否也适用于文字?例如:classC{private:constint&ref;public:C(constint&in):ref{in}{}};如果我有一个函数返回这种类型的对象Cf(){Cc(2);returnc;}如果我知道c.ref的值会在调用者中未定义吗? 最佳答案 否。构造函数完成执行后,您将无法使用该引用。当非类类型的纯右值绑定(bind)到相同类型的const引用时,总是

c++ - 与 const 引用关联的临时对象的生命周期(方法链接)

考虑以下代码片段:#includestructS{~S(){std::coutOutput:2dtor即对象生命周期通过引用扩展,这在Herb的article中有解释。.但是,如果我们只更改一行代码并写成:constS&s=S().f(1);对已销毁的对象调用f(2):Output:1dtor2为什么会这样?f()的返回值不是正确的“时间性”类型吗? 最佳答案 当你这样写一个函数时......constS&f(inti)const{std::cout...您指示编译器返回constS&并且您负责确保引用的对象具有适合调用者使用的生命

c++ - 是否可以在编译时检查 const 值是否已知?

目前,我正在重写/扩展我的C++实用程序库,以考虑新的C++11功能。其中一个新增功能是模板类,它提供一组数字的最大值,希望在编译时提供。templateclassConstMax{private:templatestaticconstexprTMax(Ts...xs);templatestaticconstexprTMax(Txx){returnx;}templatestaticconstexprTMax(T1x,T2y,Ts...xs){returny>x?Max(y,xs...):Max(x,xs...);}public:staticconstTValue=Max(Xs...);

c++ - 在 C++ 中尽可能使用 const?

正如EffectiveC++一书中所述:“尽可能使用const。”,人们会假设这个定义:Vec3foperator+(Vec3f&other);会更好地定义作为Vec3foperator+(constVec3f&other)const;或者甚至更好作为constVec3foperator+(constVec3f&other)const;。或者一个包含5个const关键字的例子:constint*constFoo(constint*const&)const;当然,您应该只在可能存在的地方包含const。我问的是尽可能使用它们是一种好习惯吗?虽然它确实为您提供了更多错误安全代码,但它可能会

c++ - 重载运算符 : const vs non-const return type : any difference of performance?

如果我们去维基百科article关于C++运算符,我们有一个例子:Addition:a+b->TT::operator+(constT&b)const;因此运算符返回类型为T的非常量。如果我们看这个guideline作者说返回类型应该是const以避免以下语法:(a+b)=c现在假设我不介意这种语法,并考虑a和b是大数组。从“纯”性能的角度来看,返回类型中缺少const关键字是否会阻止编译器的优化(g++和带有-O3的英特尔icpc)?如果答案是"is",为什么? 最佳答案 这是一个有趣的问题。在C++03中,没有更好的机会使用这两

c++ - Const temporary from template type 以及为什么使用 std::add_const?

以下代码摘自cppreference.com.#include#includestructfoo{voidm(){std::coutvoidcall_m(){T().m();}intmain(){call_m();call_m::type>();}但是,当使用VC++Nov2012CTP编译时,输出为Non-cvNon-cv而不是预期的:Non-cvConst另外,下面两个语句有什么区别:call_m();和call_m::type>(); 最佳答案 这似乎是MSVC的一个错误。使用T()形式的表达式(就标准而言,这是一种显式类型转

c++ - 我可以使用 const 引用而不是 getter 函数吗?

我只是想知道如果我只允许一个const引用变量,我是否可以绕过使用getter,如下所示#includeclasscTest{private:intm_i;std::stringm_str;public:constint&i;conststd::string&str;cTest(void):i(m_i),str(m_str){}};intmain(intargc,char*argv[]){cTesto;inti=o.i;//workso.i+=5;//failso.str.clear();//failsreturn0;}我想知道为什么人们似乎根本不这样做。我缺少一些严重的缺点吗?请贡献

c++ - 为什么 "auto"将字符串声明为 const char* 而不是 std::string?

我制作了一个模板,其中添加了给定的数据。如果我这样使用它,编译器会将in_1和in_2声明为constchar*,并且代码不会编译。#includeusingnamespacestd;templateTaddstuff(Tpart_1,Tpart_2){return(part_1+part_2);}intmain(intargc,charconst*argv[]){autoin_1="Shut";autoin_2="up.";cout如果我声明in_1和in_2std::string,它就像一个魅力。为什么编译器不能(或没有)自动声明这些字符串std::string?

c++ - 返回指针 vector 的类中的 const 方法

假设我有这个类:#includeusingnamespacestd;classBag{vectoritems;public:voidaddItem(int*i){items.push_back(i);}constvectorgetItems()const{returnitems;}};问题是我想防止更改参数项中指针指向的值。但是使用从getItems返回的vector我可以更改指向的值。现在,为了解决这个问题,我可以将参数项声明为vector但是我也无法更改类(class)中的值(value)观。有没有其他方法可以保护值但仍然不在项目声明中使用const?